package com.easylinkin.linkappapi.alarm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.easylinkin.linkappapi.alarm.entity.AlarmTemplate;
import com.easylinkin.linkappapi.alarm.mapper.AlarmTemplateMapper;
import com.easylinkin.linkappapi.alarm.service.AlarmTemplateService;
import com.easylinkin.linkappapi.common.exceptions.BusinessException;
import com.easylinkin.linkappapi.security.context.LinkappUserContextProducer;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

@Service
public class AlarmTemplateServiceImpl extends ServiceImpl<AlarmTemplateMapper, AlarmTemplate> implements AlarmTemplateService {
    @Resource
    private LinkappUserContextProducer linkappUserContextProducer;

    /**
     * 查询告警模板的列表信息
     * @param page
     * @param alarmTemplate
     * @return
     */
    @Override
    public IPage<AlarmTemplate> getAlarmTemplates(Page page, AlarmTemplate alarmTemplate) {
        alarmTemplate.setTenantId(linkappUserContextProducer.getNotNullCurrent().getTenantId());
        return baseMapper.getAlarmTemplates(page, alarmTemplate, linkappUserContextProducer.getCurrent().getId().toString());
    }

    @Override
    public List<AlarmTemplate> getAlarmTemplates(AlarmTemplate alarmTemplate) {
        alarmTemplate.setTenantId(linkappUserContextProducer.getNotNullCurrent().getTenantId());
        return baseMapper.getAlarmTemplates(alarmTemplate, linkappUserContextProducer.getCurrent().getId().toString());
    }

    /**
     * 根据id删除告警模板
     * @param id
     * @return
     */
    @Override
    public boolean deleteTemplateById(String id) {
        baseMapper.deleteById(id);
        return true;
    }

    /**
     * 新增告警模板
     * @param alarmTemplate
     * @return
     */
    @Override
    public boolean addAlarmTemplate(AlarmTemplate alarmTemplate) {
        validParamRequired(alarmTemplate);
        validParamFormat(alarmTemplate);
        validRepeat(alarmTemplate);
        
        alarmTemplate.setUserId(linkappUserContextProducer.getNotNullCurrent().getId().toString());
        alarmTemplate.setTenantId(linkappUserContextProducer.getNotNullCurrent().getTenantId());
        alarmTemplate.setCreateTime(new Date());
        alarmTemplate.setModifyTime(new Date());
        baseMapper.insert(alarmTemplate);
        return true;
    }


    /**
     * 校验参数必填
     */
    private void validParamRequired(AlarmTemplate alarmTemplate) {
        Assert.notNull(alarmTemplate, "参数为空");
        Assert.isTrue(StringUtils.isNotBlank(alarmTemplate.getName()), "名称为空");

    }

    /**
     * 校验参数格式
     */
    private void validParamFormat(AlarmTemplate alarmTemplate) {
        Assert.isTrue(alarmTemplate.getName() == null || alarmTemplate.getName().length() <= 32, "名称超长");
        Assert.isTrue(alarmTemplate.getTenantId() == null || alarmTemplate.getTenantId().length() <= 32, "租户id超长");
        Assert.isTrue(alarmTemplate.getUserId() == null || alarmTemplate.getUserId().length() <= 32, "getUserId 超长");
    }



    /**
     * 校验重复
     */
    private void validRepeat(AlarmTemplate alarmTemplate) {
        QueryWrapper<AlarmTemplate> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", alarmTemplate.getName());
        queryWrapper.eq("tenant_id", linkappUserContextProducer.getNotNullCurrent().getTenantId());
        List<AlarmTemplate> list = baseMapper.selectList(queryWrapper);
        if (list.size() == 0) {
            return;
        }
        if (list.size() > 1) {
            throw new BusinessException("名称已存在");
        }
        if (StringUtils.isEmpty(alarmTemplate.getId())) {
            throw new BusinessException("名称已存在");
        }
        if (!alarmTemplate.getId().equals(list.get(0).getId())) {
            throw new BusinessException("名称已存在");
        }

    }

    /**
     * 更新告警模板
     * @param alarmTemplate
     * @return
     */
    @Override
    public boolean updateAlarmTemplate(AlarmTemplate alarmTemplate) {
        alarmTemplate.setModifyTime(new Date());
        baseMapper.updateById(alarmTemplate);
        return true;
    }
}
